// 对axios做二次封装
// 1. 设置基地址
// 2. 封装一个通用的函数来发请求
// 3. 请求拦截器： 在发出请求之前 进入拦截器函数。做添加token操作
// 4. 响应拦截器： 在响应从服务器回来之后，先进入响应拦截器函数。做：
//                1. 统一处理401问题【没有权限，token过期】
//                2. 简化数据data的获取方式

import axios from 'axios'
const instance = axios.create({
  baseURL: 'https://apipc-xiaotuxian-front.itheima.net',
  // baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net', // 基地址
  timeout: 5000 // 最长等待时间,如果5秒请求不回来，就报错
})

// 请求拦截器： 加(注入)token
instance.interceptors.request.use(
  config => {
    // if (如果有token) {
    //    就带上
    // }

    return config
  },
  error => {
    // do something with request error
    console.log(error) // for debug
    return Promise.reject(error)
  }
)

// elinst:对代码的风格进行约束，不满足就报错
// 改正的方式:
// 1. 根据错误提示说明，逐一改正
// 2. 修改eslint的配置，让它不要报错。重启项目
// 3. 整体关闭eslint - 下策
// let a = 1
// console.log(a)

// 响应拦截器
// 默认情况下，axios会自动给后端回来的数据添加再次封装一下，在外层补充 data
instance.interceptors.response.use(
  response => response.data, // 请求成功。 简化数据data的获取方式
  error => {
    // 统一处理401
    return Promise.reject(error)
  }
)

// 定义一个函数来发请求
// 背景：本项目的接口只有两种方式：get，post
// 使用的方式：
// request('地址',请求方式, 本次请求携带的参数) ===> 返回结果
function request (url, method, queryData) {
  // 属性名前后添加[]，表示动态的属性名，[]里面可以写表达式
  return instance({
    url: url,
    method: method,
    // 对method做判断前的处理-->转成全小写，再判断
    [method.toLowerCase() === 'get' ? 'params' : 'data']: queryData
    //  post: data， get: params
  })
}

export default request
